package service

import (
	"apitestAfterGo/dao"
	"apitestAfterGo/domain"
	"apitestAfterGo/dto"
	"gorm.io/gorm"
)

type systemModuleService struct {
	GetAllSystemModuleByPage  func(dto dto.SystemModuleInputDto) ([]domain.SystemModule, int)
	GetSystemModuleBySystemId func(id int) []domain.SystemModule
	GetModulesByList          func(list dto.SystemModuleInputDtoByList) []domain.SystemModule
	AddModule                 func(module domain.SystemModule) domain.SystemModule
	ModifyModuleById          func(module domain.SystemModule) domain.SystemModule
	GetModuleById             func(id int) domain.SystemModule
	DeleteModuleById          func(id int) bool
}

var SystemModuleServiceImpl systemModuleService

func init() {
	SystemModuleServiceImpl = systemModuleService{
		GetAllSystemModuleByPage: func(dto dto.SystemModuleInputDto) ([]domain.SystemModule, int) {
			dto.Current = (dto.Current - 1) * dto.PageSize
			var modules []domain.SystemModule
			dao.GormDb.Debug().Where("system_id = ? and module_name like ?", dto.SystemId, "%"+dto.ModuleName+"%").Limit(dto.PageSize).Offset(dto.Current).Find(&modules)
			var count int64
			dao.GormDb.Debug().Model(&domain.SystemModule{}).Select("count(1)").Where("system_id = ? and module_name like ?", dto.SystemId, "%"+dto.ModuleName+"%").Count(&count)
			return modules, int(count)
		},
		GetSystemModuleBySystemId: func(id int) []domain.SystemModule {
			var modules []domain.SystemModule
			dao.GormDb.Debug().Where("system_id = ?", id).Find(&modules)
			return modules
		},
		GetModulesByList: func(list dto.SystemModuleInputDtoByList) []domain.SystemModule {
			var modules []domain.SystemModule
			if len(list.Ids) == 0 {
				list.Ids = append(list.Ids, -1)
			}
			dao.GormDb.Debug().Where("system_id = ?", list.SystemId).Find(&modules, list.Ids)
			return modules
		},
		AddModule: func(module domain.SystemModule) domain.SystemModule {
			dao.GormDb.Transaction(func(tx *gorm.DB) error {
				// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
				if err := tx.Create(&module).Error; err != nil {
					// 返回任何错误都会回滚事务
					panic(err)
				}
				// 返回 nil 提交事务
				return nil
			})
			return module
		},
		ModifyModuleById: func(module domain.SystemModule) domain.SystemModule {
			dao.GormDb.Transaction(func(tx *gorm.DB) error {
				// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
				if err := tx.Debug().Model(&module).Select("*").Omit("CreateBy", "CreatedAt").Updates(module).Error; err != nil {
					panic(err)
				}
				// 返回 nil 提交事务
				return nil
			})
			return module
		},
		GetModuleById: func(id int) domain.SystemModule {
			var module domain.SystemModule
			dao.GormDb.Debug().Model(&module).Where("id = ?", id).Find(&module)
			return module
		},
		DeleteModuleById: func(id int) bool {
			dao.GormDb.Transaction(func(tx *gorm.DB) error {
				// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
				if err := tx.Debug().Where("id = ?", id).Delete(&domain.SystemModule{}).Error; err != nil {
					// 返回任何错误都会回滚事务
					panic(err)
				}
				// 返回 nil 提交事务
				return nil
			})
			return true
		},
	}
}
